﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Administration.Entities;
using HerGoS.Interfaces;
using HerGoS.DAO;
using System.Data;
using HerGoS.Administration.Exceptions;

namespace HerGoS.Administration.Engine
{
    public class GestorBitacora
    {
        /// <summary>
        /// Obtiene las bitacoras de una entidad
        /// </summary>
        /// <param name="entidad">Objeto HGSEntity</param>
        /// <returns>Lista de las bitacoras</returns>
        public static List<Bitacora> Obtener(HGSEntity entidad)
        {
            return Obtener(entidad.GetType().Name, entidad.OID);
        }

        public static List<Bitacora> Obtener(string entidad, int oid)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "BITACORAS_PROC";
                repo.AddParameter("@ACCION", "4");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@IDUSUARIO", null);
                repo.AddParameter("@ENTIDAD", entidad);
                repo.AddParameter("@IDREGISTRO", oid);
                repo.AddParameter("@DESCRIPCION", null);
                DataTable dt = repo.ExecuteDataTable();
                List<Bitacora> result = dt.ToGenericList<Bitacora>(BitacoraConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new BitacoraGetException(ex);
            }

        }

        public static void Guardar(Bitacora bitacora)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryName);
                repo.Nombre = "BITACORAS_PROC";
                repo.AddParameter("@ACCION", bitacora.Persistencia);
                repo.AddParameter("@ID", bitacora.OID);
                repo.AddParameter("@IDUSUARIO", bitacora.Usuario.OID);
                repo.AddParameter("@ENTIDAD", bitacora.Entidad);
                repo.AddParameter("@IDREGISTRO", bitacora.Registro);
                repo.AddParameter("@DESCRIPCION", bitacora.Descripcion);
                bitacora.OID = repo.ExecuteReturnValue().ToInteger();
            }
            catch (Exception)
            {
                //La bitacora no genera error
            }
        }
        /// <summary>
        /// Guarda la bitacora de una entidad
        /// </summary>
        /// <param name="entidad">Objeto HGSEntity</param>
        public static void Guardar(HGSEntity entidad)
        {
            Bitacora bit = new Bitacora();
            bit.Usuario = HGSContext.Usuario;
            bit.Entidad = entidad.GetType().Name;
            bit.Registro = entidad.OID;

            String desc = "";
            switch (entidad.Persistencia)
            {
                case EstadoPersistencia.INSERT:
                    desc = "Nuevo";
                    break;
                case EstadoPersistencia.UPDATE:
                    desc = "Modificado";
                    break;
                case EstadoPersistencia.DELETE:
                    desc = "Eliminado";
                    break;
                case EstadoPersistencia.UNDELETE:
                    desc = "ReActivado";
                    break;
                default:
                    break;
            }

            bit.Descripcion = desc;

            Guardar(bit);
        }

        #region Converter
        public static Bitacora BitacoraConverter(DataRow row)
        {
            return new Bitacora
            {
                OID = row["bitID"].ToInteger(),
                Usuario = GestorUsuario.Obtener(row["bitIDUSUARIO"].ToInteger()),
                Fecha = row["bitFECHA"].ToDateTime(),
                Entidad = row["bitENTIDAD"].ToString(),
                Registro = row["bitIDREGISTRO"].ToInteger(),
                Descripcion = row["bitDESCRIPCION"].ToString(),
                Persistencia = EstadoPersistencia.UPDATE         
            };
        }
        #endregion
    }
}
